﻿function IsNull(o)
{
    return ("undefined" == typeof(o) || "unknown" == typeof(o) || null == o);
}
//去除字符串两边的空格
String.prototype.trim = function() {
    return this.replace(/(^\s+)|(\s+$)/g, "");
}
//检测字符串是否为空
String.prototype.isEmpty = function() {
    return !(/.?[^\s　]+/.test(this));
}
//检测值是否介于某两个指定的值之间
String.prototype.isBetween = function (val, min, max) {
    return isNaN(val) == false && val >= min && val <= max;
}
//获取最大值或最小值
String.prototype.getBetweenVal = function(what) {
    var val = this.split(',');
    var min = val[0];
    var max = val[1] == null ? val[0] : val[1];
    if (parseInt(min) > parseInt(max)) {
        min = max;
        max = val[0];
    }
    return what == 'min' ? (isNaN(min) ? null : min) : (isNaN(max) ? null : max);
}
var validator={};
//要用到的正则表达式 url 去掉 
validator.reg={
"english":/^[a-zA-Z0-9_\-]+$/,
    "chinese":/^[\u0391-\uFFE5]+$/,
    "number":/^[-\+]?\d+(\.\d+)?$/,
    "integer":/^[-\+]?\d+$/,
    "float":/^[-\+]?\d+(\.\d+)?$/,
    "date":/^(\d{4})(-|\/)(\d{1,2})\2(\d{1,2})$/,
    "email":/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/,
    "url" : /^(((ht|f)tp(s?))\:\/\/)[a-zA-Z0-9]+\.[a-zA-Z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^<>\"\"])*$/,
    "phone" : /^((\(\d{2,3}\))|(\d{3}\-))?(\(0\d{2,3}\)|0\d{2,3}-)?[1-9]\d{6,7}(\-\d{1,4})?$/,
    "mobile" : /^((\(\d{2,3}\))|(\d{3}\-))?((13\d{9})|(159\d{8}))$/,
    "ip" : /^(0|[1-9]\d?|[0-1]\d{2}|2[0-4]\d|25[0-5]).(0|[1-9]\d?|[0-1]\d{2}|2[0-4]\d|25[0-5]).(0|[1-9]\d?|[0-1]\d{2}|2[0-4]\d|25[0-5]).(0|[1-9]\d?|[0-1]\d{2}|2[0-4]\d|25[0-5])$/,
    "zipcode": /^[1-9]\d{5}$/,
    "qq" : /^[1-9]\d{4,10}$/,
    "msn" : /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/,
    "idcard" : /(^\d{15}$)|(^\d{17}[0-9Xx]$)/
};
//提示信息
validator.tip={
    "unknow":"未找到的验证类型，无法执行验证。",
    "paramError":"参数设置错误，无法执行验证。",
    "required":"",
    "english":"仅允许英文字符及下划线 (a-zA-Z0-9_)。",
    "chinese":"仅允许中文字符。",
    "number":"不是一个有效的数字。",
    "integer":"不是一个有效的整数。",
    "float":"不是一个有效的浮点数。",
    "date":"不是一个有效的日期格式。 (例如：2007-06-29)",
    "email":"不是一个有效的电子邮件格式。",
    "url":"不是一个有效的超链接格式。",
    "phone":"不是一个有效的电话号码。",
    "mobile":"不是一个有效的手机号码。",
    "ip":"不是一个有效的IP地址。",
    "zipcode":"不是一个有效的邮政编码。",
    "qq":"不是一个有效的QQ号码。",
    "msn":"不是一个有效的MSN帐户。",
    "idcard":"不是一个有效的身份证号码。",
    "notSame":"两次输入的内容不一致，请重新输入。"
};
//安装
validator.setup=function(selector)
{
    validator.selector=selector;
    $(selector+" input,textarea,select").each(
        
        function()
        {
           if(!IsNull($(this).attr('isvalidator')))
           {
               $(this).blur(
                    function()
                    {
                        if(validator.doValidate($(this),validator.feedback))
                        {
                            validator.OK($(this));
                        }
                    }
               )
           }
        }
    );
}
//验证全部
validator.validatorAll=function(selector)
{
    var bl=true;
    if(typeof(validator.selector)=="undefined") //如果没有执行validator.setup
        validator.selector=selector;
    $(validator.selector+" input,textarea,select").each(
        function()
        {
           if(!IsNull($(this).attr('isvalidator')))
           {
                if(validator.doValidate($(this), validator.feedback))
                {
                   validator.OK($(this));
                }
                else
                   bl=false;
           }
        }
    );
    return bl;
}
//关闭错误提示
validator.OK=function(ele)
{
    if(!IsNull(ele.attr('validatormsg')))
    {
        $("#"+ele.attr('validatormsg')).fadeOut("slow");
        $("#"+ele.attr('validatormsg')).html("");
    }
    else
    {
        ele.next().fadeOut("slow",function(){ ele.next().remove();});
        ele.removeClass("alert");
    }
}
//显示错误提示
validator.feedback = function(ele, type) 
{
    var msg = validator.tip[type];
    if(typeof(msg)=="undefined")  // type 也可以直接是要显示的信息，注意，这个信息不能是tip的key，否则会有歧义
        msg=type;
    ele.addClass("alert");
 
    var _eleName = "";
    if(!IsNull(ele.attr('controlname')))
        _eleName = ele.attr('controlname');
    
    var _msgObj;
    
    if(!IsNull(ele.attr('validatormsg')))
    {
        _msgObj=$("#"+ele.attr('validatormsg')); 
        _msgObj.html("<span class=\"alertMsg\">" + _eleName + msg + "</span>");
    }
    else
    {
        _msgObj=$("<div class=\"validator_msgSpan\" style=\"display: none; left: 0px; padding: 0px;\"><div style=\"margin: 2px 0; width: auto; float: left;\"> * " + _eleName + msg + "</div></div>");
        ele.parent().append(_msgObj);
    }
    
    _msgObj.fadeIn("slow");
}
//执行验证
validator.doValidate=function(element,feedback)
{
    var v = element.val();
    //alert(v);
    var controlname=element.attr("controlname");
    //验证是否允许非空
    var required = element.attr('required');
    if (required != null && v.isEmpty()) {
        feedback(element,'required');
        return false;
    }
    //验证是否合法格式
    var datatype = element.attr('datatype');
    if (!v.isEmpty() && datatype != null && datatype.toLowerCase() != 'password') {
        datatype = datatype.toLowerCase();
        try {
           if (!(validator.reg[datatype]).test(v)) {
            feedback(element,datatype);
            return false;
           }
        } catch(e) {
           feedback(element,'unknow');
           return false;
        }
    }
    //执行数据验证
    var confirmObj = element.attr('confirmObj');
    if (confirmObj != null) {
        try {
           var data = $(confirmObj).val();//eval('formObj.' + confirmObj + '.value');
           if (v != data) {
            //alert('两次输入的内容不一致，请重新输入。');
            feedback(element,"notSame");
            return false;
           }
        }
        catch (e) {
           feedback(element,'paramError');
           return false;
        }
    }
    //验证数字大小
    var dataBetween = element.attr('dataBetween');
    if (!v.isEmpty() && dataBetween != null) {
        var min = dataBetween.getBetweenVal('min');
        var max = dataBetween.getBetweenVal('max');
        if (min == null || max == null) {
           feedback(element,'paramError');
           return false;
        }
        if (!v.isBetween(parseInt(v.trim()), min, max)) {
           feedback(element,controlname + '必须是介于 ' + min + '-' + max + ' 之间的数字。');
           return false;
        }
    }
    //验证字符长度
    var dataLength = element.attr('dataLength');
    if (!v.isEmpty() && dataLength != null) {
        var min = dataLength.getBetweenVal('min');
        var max = dataLength.getBetweenVal('max');
        if (min == null || max == null) {
           feedback(element,'paramError');
           return false;
        }
        if (!v.isBetween(v.trim().length, min, max)) {
           feedback(element,controlname + '必须是 ' + min + '-' + max + ' 个字符。');
           return false;
        }
    }
    return true;
}